/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package cong.javadanang.controller.bean;

import cong.javadanang.model.dao.PostDAO;
import cong.javadanang.model.dao.impl.PostDAOImpl;
import cong.javadanang.model.entity.Category;
import cong.javadanang.model.entity.Comment;
import cong.javadanang.model.entity.Post;
import cong.javadanang.model.entity.User;
import cong.javadanang.utils.Support;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

/**
 *
 * @author Pham
 */
@ManagedBean
@RequestScoped
public class PostManagement {

    private final PostDAO POST_SERVICE = PostDAOImpl.getInstance();
    private List<Post> posts = null;
    private Post post;
    private List<Post> postListRecent;
    private List<Post> postListMostVoted;
    private List<Post> postListMostViewed;

    public PostManagement() {
        posts = POST_SERVICE.getPosts(1);
    }

    public void createPost(ActionEvent evt) {
        String msg = "";
        String title = this.post.getTitle();
        String content = this.post.getContent();
        String attachPath = this.post.getAttachPath();
        Date createDate = new Date();
        User user = Support.getCurrentUser();
        Category category = this.post.getCategory();
        boolean active = false;

        Post newPost = new Post(1, category, user, title, content, attachPath, createDate, null, 0, 1, active);
        if (POST_SERVICE.createPost(newPost)) {
            msg += "Bạn đã tạo thành công bài viết.";
        } else {
            msg += "Tạo bài viết mới thất bạn! Vui lòng kiểm tra lại thông tin.";
        }
        addMessages(msg);
    }

    public void updatePost(ActionEvent evt) {
        String msg = "";
        int postId = this.post.getPostId();
        String title = this.post.getTitle();
        String content = this.post.getContent();
        String attachPath = this.post.getAttachPath();
        Date updateDate = new Date();
        Category category = this.post.getCategory();

        Post currentPost = new Post(postId, category, null, title, content, attachPath, updateDate, updateDate, postId, postId, true);
        if (POST_SERVICE.updatePost(currentPost)) {
            msg += "Bạn đã sửa thành công bài viết.";
        } else {
            msg += "Sửa bài viết thất bạn! Vui lòng kiểm tra lại thông tin.";
        }
        addMessages(msg);
    }

    public void deletePost(ActionEvent evt) {
        String msg = "";
        int postId = this.post.getPostId();
        Post currentPost = POST_SERVICE.getPostById(postId);
        if (POST_SERVICE.deletePost(currentPost)) {
            msg += "Bạn đã xóa thành công bài viết.";
        } else {
            msg += "Xóa bài viết thất bạn! Vui lòng kiểm tra lại thông tin.";
        }
        addMessages(msg);
    }

    public void disablePost(ActionEvent evt) {
        String msg = "";
        int postId = this.post.getPostId();
        Post currentPost = POST_SERVICE.getPostById(postId);
        if (POST_SERVICE.deletePost(currentPost)) {
            msg += "Bạn đã ẩn bài viết thành công.";
        } else {
            msg += "Ẩn bài viết thất bạn! Vui lòng kiểm tra lại thông tin.";
        }
        addMessages(msg);
    }

    public void enablePost(ActionEvent evt) {
        String msg = "";
        int postId = this.post.getPostId();
        Post currentPost = POST_SERVICE.getPostById(postId);
        if (POST_SERVICE.restorePost(currentPost)) {
            msg += "Bạn đã kích hoạt bài viết thành công.";
        } else {
            msg += "Kích hoạt bài viết thất bạn! Vui lòng kiểm tra lại thông tin.";
        }
        addMessages(msg);
    }

    public void addVote(ActionEvent event) {
        int postId = this.post.getPostId();
        int vote = POST_SERVICE.getPostById(postId).getVote() + 1;
        Post currentPost = new Post(postId, null, null, null, null, null, null, null, vote, vote, true);
        if (!POST_SERVICE.updateVote(currentPost)) {
            addMessages("Có lỗi xảy ra khi bình chọn bài viết này.");
        }
    }

    public void subVote(ActionEvent event) {
        int postId = this.post.getPostId();
        int vote = POST_SERVICE.getPostById(postId).getVote() - 1;
        Post currentPost = new Post(postId, null, null, null, null, null, null, null, vote, vote, true);
        if (!POST_SERVICE.updateVote(currentPost)) {
            addMessages("Có lỗi xảy ra khi bình chọn bài viết này.");
        }
    }

    public void addViewer(Post post) {
//        int postId = this.post.getPostId();
        int viewCount = post.getViewCount() + 1;
        Post currentPost = new Post(post.getPostId(), null, null, null, null, null, null, null, viewCount, viewCount, true);
        if (!POST_SERVICE.updateViewCount(currentPost)) {
            addMessages("Có lỗi xảy ra khi bình chọn bài viết này.");
        }
    }

    public List<Post> getPostListRecent() {
        postListRecent = new ArrayList<>();
        if (posts != null) {
            if (posts.size() > 5) {
                for (int i = posts.size() - 1; i > posts.size() - 6; i--) {
                    Post p = posts.get(i);
                    postListRecent.add(p);
                }
            } else {
                for (int i = posts.size() - 1; i >= 0; i--) {
                    Post p = posts.get(i);
                    postListRecent.add(p);
                }
            }
        } else {
            postListRecent = null;
        }
        return postListRecent;
    }

    public List<Post> getPostListMostVoted() {
        if (posts != null) {
            if (posts.size() > 5) {
                postListMostVoted = POST_SERVICE.getPostMostVoted().subList(0, 5);
            } else {
                postListMostVoted = POST_SERVICE.getPostMostVoted();
            }
        } else {
            postListMostVoted = null;
        }
        return postListMostVoted;
    }

    public List<Post> getPostListMostViewed() {
        if (posts != null) {
            if (posts.size() > 5) {
                postListMostViewed = POST_SERVICE.getPostMostViewed().subList(0, 5);
            } else {
                postListMostViewed = POST_SERVICE.getPostMostViewed();
            }
        } else {
            postListMostViewed = null;
        }
        return postListMostViewed;
    }

    public Comment getLastComment(Post post) {
        Comment comment;
        List<Comment> comments = post.getComments();
        if (!comments.isEmpty()) {
            comment = comments.get(comments.size() - 1);
        } else {
            comment = null;
        }
        return comment;
    }

    public Date getCommentDate(Post post) {
        String strDate;
        Date d;
        List<Comment> comments = post.getComments();
        if (comments.get(comments.size() - 1).getUpdateDate() == null) {
            d = comments.get(comments.size() - 1).getCreateDate();
        } else {
            d = comments.get(comments.size() - 1).getUpdateDate();
        }

        return d;
    }

    public void addMessages(String msg) {
        FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_INFO, msg, "Message!");
        FacesContext.getCurrentInstance()
                .addMessage(null, fm);
    }

    public List<Post> getPosts() {
        return posts;
    }

    public void setPosts(List<Post> posts) {
        this.posts = posts;
    }

    public Post getPost() {
        if (post == null) {
            post = new Post();
        }
        return post;
    }

    public void setPost(Post post) {
        this.post = post;
    }

}
